<?php

/**
 * @Author: wuchenge
 * @Date: 2020-11-30 14:11:39
 */

namespace App\Models;

use App\Models\Rbac\Role;
use App\Services\Permission;
use DB;

class Admin extends Model
{
    protected $table    = 'admins';
    protected $guarded  = ['id', 'created_at', 'updated_at'];
    protected $fillable = ['account', 'pwd', 'nick_name', 'type', 'status'];

    /**
     * 关联token
     * @return [type] [description]
     */
    public function tokens()
    {
        return $this->morphMany(Token::class, 'accountable');
    }

    /**
     * 关联角色表 多对多
     * @return [type] [description]
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class, 'rbac_role_admin', 'admin_id', 'role_id');
    }

    /**
     * 定义加密
     * @param  [type] $pwd [description]
     * @return [type]      [description]
     */
    public static function encodePwd($pwd)
    {
        return hash_hmac('sha256', $pwd, config('app.name'));
    }

    /**
     * 新增管理员
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public static function store($data)
    {
        // 开启一个数据库事务
        return DB::transaction(function () use ($data) {
            $admin = self::create($data);
            $roles = $data['roles'] ?? [];
            if (!empty($roles)) {
                // 关联节点
                $admin->roles()->attach($roles);
            }

            return $admin;
        });
    }

    /**
     * 修改管理员
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public static function modify($data)
    {
        // 开启一个数据库事务
        $admin = DB::transaction(function () use ($data) {
            $id = $data['id'] ?? 0;

            $admin = self::find($id);
            if (!$admin) {
                return false;
            }

            // 超级管理员只能被自己修改
            $is_supper = Permission::isSupper($id);
            if ($is_supper && $id != $data['admin_id']) {
                return false;
            }

            $admin->fill($data)->save();
            // 关联角色
            $roles = $data['roles'] ?? [];
            $admin->roles()->sync($roles);

            return $admin;
        });

        return $admin;
    }

    public static function del($ids)
    {
        // 开启一个数据库事务
        $res = DB::transaction(function () use ($ids) {
            $model = self::whereIn('id', $ids);
            $model->get()->map(function (Admin $admin) {
                // 关联角色删除
                $admin->roles()->detach();
            });
            $model->delete();

            return true;
        });

        return $res;
    }
}
